#include <bits/stdc++.h>
using namespace std;

#define ll long long

const int N=1e5+7;

struct node{
	int l,r ;
	bool f;
	ll sum,k;
}s[N<<2];

int a[N];
void build(int p,int l,int r){
	if(l==r){
		s[p].r=s[p].l=l;
		s[p].sum=a[l];
		return ;
	} 
	int left=p*2;
	int right=left+1;
	int mid=(l+r)>>1;
	build(left,l,mid);
	build(right,mid+1,r);
	s[p].l=l;
	s[p].r=r;
	s[p].sum=s[left].sum+s[right].sum;
	return ;
}

inline void push(int p){
	if(s[p].l==s[p].r){
		s[p].f=0;
		s[p].k=0;
		return ;	
	}
	int left=p*2;
	int right=left+1;
	int mid=(s[p].l+s[p].r)>>1;
	s[left].f=s[right].f=1;
	s[left].k+=s[p].k;
	s[right].k+=s[p].k;
	s[left].sum+=(mid-s[p].l+1)*s[p].k;
	s[right].sum+=(s[p].r-mid)*s[p].k;
	s[p].k=0;
	s[p].f=0;
}

void add(int p,int l,int r,int k){
	if(l==s[p].l&&r==s[p].r){
		s[p].f=1;
		s[p].k+=k;
		s[p].sum+=k*(r-l+1);
		return ;
	} 
	if(s[p].f)push(p);
	int left=p*2;
	int right=left+1;
	int mid=(s[p].l+s[p].r)>>1;
	if(r<=mid)add(left,l,r,k);
	else if(l>mid)add(right,l,r,k);
	else {
		add(left,l,mid,k);
		add(right,mid+1,r,k);
	}
	s[p].sum=s[left].sum+s[right].sum;
	return ;
}

ll get(int p,int l,int r){
	if(l==s[p].l&&r==s[p].r)return s[p].sum;
	if(s[p].f)push(p);
	int left=p*2;
	int right=left+1;
	int mid=(s[p].l+s[p].r)>>1;
	ll ans;
	if(r<=mid)ans=get(left,l,r);
	else if(l>mid)ans=get(right,l,r);
	else ans=get(left, l,mid)+get(right,mid+1,r);
	return ans;
}

void print(int p,int t){
	for(int i=1;i<=t;i++)printf("\t");
	printf("L %d - R %d - k %d - sum %d - f %d\n",s[p].l,s[p].r,s[p].k,s[p].sum,s[p].f);
	if(s[p].l!=s[p].r){
		print(p<<1,t+1);
		print(p<<1|1,t+1);
	}
}


int main(){
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	build(1,1,n);
	while(m--){
		int p;
		scanf("%d",&p);
		int x,y,k;
		if(p==1){
			scanf("%d%d%d",&x,&y,&k);
			add(1,x,y,k);
		} else if(p==2){
			scanf("%d%d",&x,&y);
			printf("%lld\n",get(1,x,y));
		} else print(1,1);
	}
	return 0;
}
